#ifndef __MOTOR_ENCO_H__
#define __MOTOR_ENCO_H__

#include "app_main.h"

//=================================用户修改======================================
#define Enco_Max (int)16384 // 14位磁编码器满量程值(0x3fff+1)。型号MT6816
#define Enco_Max_Half (Enco_Max>>1)
#define Enable_Parity false // 启用奇偶校验，关闭后角度输出居然好了不少
#define Enco_CS_Down() HAL_GPIO_WritePin(ENCO_CS_GPIO_Port, ENCO_CS_Pin, GPIO_PIN_RESET)
#define Enco_CS_Up() HAL_GPIO_WritePin(ENCO_CS_GPIO_Port, ENCO_CS_Pin, GPIO_PIN_SET)
//===================================END========================================

typedef struct
{
    // 磁编码器的原始计数值
    int32_t raw;
    // 磁编码器的旋转方向，+1 表示顺时针，-1 表示逆时针
    int8_t dir;
    // 磁编码器的当前计数值（在一个完整编码器周期内的计数值）
    int32_t count;
    // 上一次编码器周期的计数值
    int32_t count_prev;
    // 累计计数值（所有编码器周期内的累积计数值）
    int32_t acc_count;
    // 编码器周期内计数值的差分
    int32_t delta_count;

    // 用于磁编码器线性化的查找表
    int32_t offset_lut[128];
    // 零点偏移
    int32_t offset;

    // 机械角度，即编码器计数值经过线性化处理后得到的机械角度值
    float mec_angle;
    // 电机转速
    float speed;
    // 电角度，对应于机械角度的电机转子位置（根据电机的极对数计算得到），直接赋给foc.theta
    float elec_angle;
} stMotorEnco_Para_type;

float Motor_Enco_readTheta(stMotorEnco_Para_type *Enco_Para, uint8_t _MotorPairs);
float Motor_Enco_caliSpeed(stMotorEnco_Para_type *Enco_Para);

#endif